package com.cn.JUC.utils.case3;

import java.util.List;
import java.util.Vector;
import java.util.concurrent.Semaphore;
import java.util.function.Function;

/**
 * @Title 对象池
 * @Description 对象池类似于线程池
 * @Author CAI ZHAI
 * @Date 2021/9/2 7:39
 **/
class ObjPool<T, R> {
    final List<T> pool;
    // 用信号量实现限流器
    final Semaphore sem;
    // 构造函数
    ObjPool(int size, T t){
        pool = new Vector<T>(){};
        for(int i=0; i<size; i++){
            pool.add(t);
        }
        sem = new Semaphore(size);
    }
    // 利用对象池的对象，调用func
    R exec(Function<T,R> func) {
        T t = null;
        try{
            sem.acquire();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        try {
            t = pool.remove(0);
            return func.apply(t);
        } finally {
            pool.add(t);
            sem.release();
        }
    }
    
    public static void main(String[] args){
        // 创建对象池
        ObjPool<Long, String> pool = new ObjPool<Long, String>(10, 2L);
        // 通过对象池获取t，之后执行
        pool.exec(a -> {
            System.out.println(a);
            return a.toString();
        });
    }
}


